#include "mprpcapplication.h"
#include <iostream>

#include <unistd.h> // for        int getopt(int argc, char * const argv[], const char *optstring);
#include <string>
#include <fstream> // 打开配置文件

// 静态成员变量初始化
MprpcConfig MprpcApplication::m_config;

void ShowArgsHelp()
{
    std::cout << "format: command -i <configFilePath>" << std::endl;
}

void MprpcApplication::Init(int argc, char **argv)
{
    if (argc < 2)
    {
        // 打印参数帮助说明
        ShowArgsHelp();
        exit(EXIT_FAILURE);
    }

    int opt = 0;
    // 配置文件的路径
    std::string configFilePath;
    // getopt() 函数返回找到的选项，并更新全局变量optind和optarg。optind是下一个要处理的argv索引，而optarg指向与当前选项关联的参数（如果有）
    while ((opt = getopt(argc, argv, "i:")) != -1)
    {
        switch (opt)
        {
        case 'i':                    // 有配置文件 如果选项字符串中包含 "i" 并且命令行参数中提供了 -i 选项，则 getopt 将返回 'i'
            configFilePath = optarg; // 而optarg指向与当前选项关联的参数（如果有）
            break;
        case ':': // 如果选项需要一个参数但没有提供，而选项字符串的第一个字符是 ':'，那么 getopt 将返回 ':' 来表示缺少参数的情况。
            ShowArgsHelp();
            exit(EXIT_FAILURE);
        case '?': // 如果getopt()遇到一个不在optstring中的选项字符，它会返回'?'，并且全局变量optopt会包含无效选项字符的值。
            ShowArgsHelp();
            exit(EXIT_FAILURE);
        default:
            break;
        }
    }
    // 开始加载配置文件
    m_config.LoadConfigFilePath(configFilePath.c_str());
}

MprpcApplication &MprpcApplication::GetInstance()
{
    static MprpcApplication app;
    return app;
}

MprpcConfig &MprpcApplication::GetConig()
{
    return m_config;
}
